package models

import (
	"errors"
	"time"
)

type SysMenuNew struct {
	ID                 int64  `json:"id" gorm:"primaryKey"`  // 菜单id
	ParentID           int64  `json:"parent_id"`             // 父id
	MenuName           string `json:"menu_name"`             // 名称
	MenuType           int    `json:"menu_type"`             // 菜单类型(0: 目录 1: 菜单 2: 按钮 3: UI片段)。
	FormRouterName     string `json:"form_router_name"`      // 前端表单路由名称，仅用于menu_type为1的菜单类型。
	OnlineFormID       int    `json:"online_form_id"`        // 在线表单主键Id，仅用于在线表单绑定的菜单。
	OnlineMenuPermType int    `json:"online_menu_perm_type"` // 在线表单主键Id，仅用于在线表单绑定的菜单。
	ShowOrder          int    `json:"show_order"`            // 在线表单主键Id，仅用于在线表单绑定的菜单。
	Icon               string `json:"icon"`

	CreateTime   time.Time     `json:"create_time"`
	CreateUserID int64         `json:"create_user_id"`
	UpdateTime   time.Time     `json:"update_time"`
	UpdateUserID int64         `json:"update_user_id"`
	DeletedFlag  int           `json:"deleted_flag"` // 1正常 -1 已经删除
	SysPermCode  []SysPermCode `gorm:"many2many:sys_menu_perm_code;"`
}

func GetAllMenuList() ([]SysMenuNew, error) {
	var menus []SysMenuNew
	err := db.Where("menu_type", []int64{SYS_MENU_TYPE_DIRECTORY, SYS_MENU_TYPE_MENU}).Order("show_order desc").Find(&menus).Error
	return menus, err
}

func GetMenuListByUserId() ([]SysMenuNew, error) {
	var menus []SysMenuNew
	err := db.Raw("SELECT m.* FROM sys_user_role ur, sys_role_menu rm, sys_menu_news m where	AND ur.user_id = ? AND ur.role_id = rm.role_id 	AND rm.menu_id = m.menu_id 	AND m.menu_type <= ? ORDER BY m.show_order", 3, 3).Scan(&menus).Error
	return menus, err
}

func DelMenuByID(id int64) error {
	err := db.Where("parent_id = ?", id).First(&SysMenuNew{}).Error
	if err != nil {
		return errors.New("此菜单存在子菜单不可删除")
	} else {
		var menu SysMenuNew
		err := db.Where("id = ?", id).First(&menu).Delete(&menu).Error
		return err
	}
	return err
}

const (
	SYS_MENU_TYPE_DIRECTORY = iota // 目录菜单
	SYS_MENU_TYPE_MENU             // 普通菜单
	SYS_MENU_TYPE_FRAGMENT         // 表单片段类型
	SYS_MENU_TYPE_BUTTON           // 按钮类型
)
